home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 1 (Walnut Creek)
/
Aminet - June 1993 [Walnut Creek].iso
/
usenet
/
sources
/
volume2
/
unix
/
tail.1
< prev
next >
Wrap
Internet Message Format
|
1988-12-06
|
17KB
Path: xanth!ames!mailrus!ulowell!page
From: page@swan.ulowell.edu (Bob Page)
Newsgroups: comp.sources.amiga
Subject: v02i092: tail - look at the end of a file
Message-ID: <10496@swan.ulowell.edu>
Date: 5 Dec 88 23:12:24 GMT
Organization: University of Lowell, Computer Science Dept.
Lines: 512
Approved: page@swan.ulowell.edu
Submitted-by: brant@uf.msc.umn.edu (Gary Brant)
Posting-number: Volume 2, Issue 92
Archive-name: unix/tail.1
Tail now works with *real* pipes, will run with the default stack size
of 4000 bytes and has no line limit.
[uuencoded executable also enclosed; it's small. ..Bob]
# This is a shell archive.
# Remove everything above and including the cut line.
# Then run the rest of the file through sh.
#----cut here-----cut here-----cut here-----cut here----#
#!/bin/sh
# shar: Shell Archiver
# Run the following text with /bin/sh to create:
# readme
# tail.doc
# tail.uu
# tail.c
# alloc.c
# makefile
# This archive created: Mon Dec 5 18:04:37 1988
cat << \SHAR_EOF > readme
This is a replacement for the tail which i submitted a few weeks ago. It
fixes a few problems, notably it now works with *real* pipes, it will run
with the default stack size of 4000 bytes, and the arbitrary maximum line
limit of 4096 has been removed all with no decrease in performance.
-Gary Brant
The source & binary are freely distributable; you may do anything
you like with them except sell them for profit as long as you leave
my name in the source and include this notice with the source files.
Have fun.
Gary Brant
US mail: 1355 Eustis St. #1
St. Paul, MN 55108
ARPA: brant@uc.msc.umn.edu
SHAR_EOF
cat << \SHAR_EOF > tail.doc
TAIL USER COMMANDS TAIL
NAME
tail - display the last part of a file
SYNOPSIS
tail +|-number [ filename ...]
DESCRIPTION
tail copies filename to the standard output beginning at a
designated place. If no file is named, the standard input
is used.
OPTIONS
+number
Begin copying at number lines from the beginning of the
file. If number is not specified, the value 10 is used.
-number
Begin copying at number lines from the end of the file.
If number is not specified, the value 10 is used.
SEE ALSO
head
BUGS
Data for a tail relative to the end of the file is stored in
a buffer, and thus is limited to available memory.
SHAR_EOF
cat << \SHAR_EOF > tail.uu
begin 777 tail
M```#\P`````````#``````````(```4N````E0````$```/I```%+D[Z"4!."
M5?_R0FW_^C`L@`)(P"M`__12;?_Z,"W_^K!M``AL``$4,"W_^DC`Y8`@;0`*`
M(G`(``P1`"UF)#`M__I(P.6`(&T`"B\P"`!.N@+(6$\K0/_T.6W_]H`"8```#
MUC`M__I(P.6`(&T`"B)P"``,$0`K9B8P+?_Z2,#E@"!M``HO,`@`3KH"CEA/>
M1(`K0/_T.6W_]H`"8```FE)L@`1(>@#","W_^DC`Y8`@;0`*+S`(`$ZZ!@I0H
M3RM`__QF.$AL@&Q(>@"@3KH$DE!/2&R`;#`M__I(P.6`(&T`"B\P"`!.N@1XW
M4$](;(!L/SP`"DZZ#'Q<3V!`+RW_]#`M__I(P.6`(&T`"B\P"``O+?_\86A/>
M[P`,.T#_^"\M__Q.N@RR6$]*;?_X9PH_+?_X3KH#;E1/8`#^X$IL@`1F&B\MC
M__1(>@`T2&R`0&$N3^\`##\`3KH#2E1/0F=.N@-"5$].74YU<@!T86EL.B!C-
M86XG="!O<&5N(````$Y5_!)(YP\P*"T`$$J$;&`@!%*$2H!L'"\M``@_/`/H0
M2&W\%DZZ`VA/[P`**T#\$F<"8-Q*K?P29S(O+0`,3KH!&%A/+RT`"#\\`^A(`
M;?P63KH#/$_O``I*@&<02&R`5DAM_!9.N@-\4$]@V&```,J5RGX`+RT`"#\\D
M`^A(;?P63KH##$_O``I*@&<``()(;?P63KH"Z%A/.T#__E*'OH1O#"P*)%(O-
M!DZZ`=!83S`M__Y:0#\`3KH!/E1/*@!F*DAL@&Q(>@!V3KH#&%!/(`IG#BP*,
M)%(O!DZZ`:!83V#N<!1,WPSP3EU.=2`*9@0D16`")H4F14AM_!8@15B(+PA.H
MN@)J4$\@14*08`#_:"\M``QA1%A/(`IG'DAL@%8@2EB(+PA.N@*\4$\L"B12"
M+P9.N@%(6$]@WG``8*9N;W0@96YO=6=H(&UE;6]R>2!F;W(@;&ES=`H`3E4`!
M`$IL@`1G*DAL@%9(>@`H3KH"=E!/2&R`5B\M``A.N@)H4$](;(!62'H`$4ZZ"
M`EI03TY=3G4]/3X@`"`\/3T*``!.50``2.<.`'@`>@%@,+P\`#!M'KP\`#EN6
M&'(*(`1.N@G2*``0!DB`D'P`,$C`V(!@"C`L@`)(P"@`8`Q212!M``@<,%``I
M9L8@!$S?`'!.74YU3E4``$Y=3G5.50``2.<(,#`M``C0?``/YDCG0'(`,@`H5
M`29L@`8@"V820>R"!B9(*4B`!BE(@@9"K((*)%,@*@`$L(1E*B`J``2PA&8$]
M)I)@#)FJ``35Z@`$)40`!"E+@`9"DB`*4(!,WPP03EU.=;7L@`9F#DZZ`((DA
M0$J`9@1P`&#D)DHD4F"T8-Q.50``2.<`,"1M``A1BB9L@`:URV,$M=-E%+?3>
M902URV(,M]-E!+73900F4V#D(&H`!-'*L=-F$"!3("@`!-&J``0@4R208`(D&
MDR!K``31R['*9@P@*@`$T:L`!":28`(FBBE+@`9,WPP`3EU.=4Y5```O"D*GG
M2'@0`$ZZ#\Q03R1`2H!F"'``)%].74YU0I(E?```$```!"!*4(@O"$ZZ_V!80
M3R`L@`9@WDY5__Q(YP`P)&R`!B`*9R8F4BMJ``3__$JM__QC$$*J``0O+?_\A
M+PI.N@^:4$\D2[7L@`9FUC\M``A.N@T:5$],WPP`3EU.=2!O``0@"")O``@0J
MV6;\3G4@;P`$(`A*&&;\D<`@"%.`3G5.50``2.<(("1M``A3;0`,2FT`#&\@]
M+RT`#DZZ`&XX`+!\__]83V<.($I2BA"$N'P`"F<"8-9"$KA\__]F$+7M``AFA
M"G``3-\$$$Y=3G4@+0`(8/).50``+PHD;0`(2A)G)"\M``P@2E**$!!(@#\`_
M3KH'LK!\__]<3V8(</\D7TY=3G5@V'``8/1.50``2.<(("1M``@O"DZZ`#(X>
M`+!\__]83V<B,`1(P&`44Y((Z@`#``QP_TS?!!!.74YU8-9*@&?Z68!GY#`$%
M8.I.50``+PHD;0`((%*QZ@`$90PO"F$66$\D7TY=3G4@4E*2$!!(@,!\`/]@B
M[$Y5``!(YP@P)&T`"!`J``S`/``89PIP_TS?#!!.74YU"*H``@`,2JH`"&8(H
M+PI.N@E`6$\0*@`,2(`(```'9S!![(!`)D@0*P`,2(#`?`"$L'P`A&8,/SS_K
M_R\+3KH'^%Q/U_P````60>R!^+?(9=8_*@`0+RH`"!`J``U(@#\`3KH"/C@`<
M2D!03VX42D1F!'`(8`)P$($J``QP_V``_WHP!$C`)*H`"-"J``@E0``$(%)2]
MDA`02(#`?`#_8`#_6DY5```O"DZZ"'`D0$J`9@AP`"1?3EU.=2\*+RT`#"\M$
M``AA!D_O``Q@Z$Y5``!(YP@@+RT`$$ZZ!MI![(`*)$A83TH29A`Y?``%@@YPE
M`$S?!!!.74YU($HB;0`,$!BP&68$2@!F]I`A2(!G!%R*8-(_*@`$+RT`"$ZZ(
M`$`X`+!\__]<3V8$<`!@Q"!M`!`11``-(&T`$!%\``$`#"`M`!!@K$Y5```_,
M+0`,/SP#`2\M``AA!E!/3EU.=4Y5``!(YP\P)&T`"$ZZ"A(F;((0>`!@#C`$<
MP?P`!DJS"`!G#E)$N&R!^&WL>@9@``#$""T``0`,9S!(>/__+PI.N@O^+`!0*
M3V<@+P9.N@PV+PI.N@O$2H!03V8.3KH+SCH`L'P`S68``(Q(>`/M+PI.N@O<@
M+`!*AE!/9F`(+0````QF!'H!8&Q(>`/N+PI.N@N^+`!03V8(3KH+DCH`8%1(B
M>``A2'H`DDZZ#%XN`%!/9PHO!TZZ#`!83V`>2'@``4AZ`((O!DZZ"\A(>/__?
M0J<O!DZZ"YY/[P`88"8P+0`,P'P%`+!\!0!F&"\&3KH+$GH$6$\Y18(.</],,
MWPSP3EU.=3`$P?P`!B>&"``P!,'\``8@0-'+,6T`#``$""T``P`,9Q!(>``!2
M0J<O!DZZ"T1/[P`,,`1@PF1O<RYL:6)R87)Y````3E4``$CG#"`X+0`(3KH(Y
MS#`$P?P`!B1`U>R"$$I$;0JX;('X;`1*DF80.7P``H(.</],WP0P3EU.=3`J[
M``3`?``#L'P``68*.7P`!8(.</]@X'``,"T`#B\`+RT`"B\23KH*O"H`L+S_M
M____3^\`#&8,3KH*<CE`@@YP_V"T(`5@L&%P0^R"`D7L@@*UR68.,CP`%&L(>
M=``BPE')__PI3X(4+'@`!"E.@AA(YX"`""X`!`$I9Q!+^@`(3J[_XF`&0J?SJ
M7TYS0_H`($ZN_F@I0((<9@PN/``#@`=.KO^48`1.N@`:4$].=61O<RYL:6)R@
M87)Y`$GY``!__DYU3E4``"\*2'D``0``,"R!^,'\``8O`$ZZ"FPI0((04$]FQ
M%$*G2'D``0``3KH*,%!/+FR"%$YU(&R"$$)H``0@;((0,7P``0`0(&R"$#%\&
M``$`"B!L@A0@+((4D*@`!%"`*4""("!L@B`@O$U!3EA"ITZZ"B`D0$JJ`*Q8;
M3V<N+RT`#"\M``@O"DZZ`*XY?``!@B0@;((0`&B````$(&R"$`!H@```"D_O3
M``Q@0DAJ`%Q.N@H^2&H`7$ZZ"@`I0((F(&R")DJH`"103V<0(&R")B)H`"0ON
M$4ZZ"/)83R\L@B8O"DZZ^,@I;((F@BI03TZZ"/(@;((0((!.N@D@(&R"$"%`V
M``9G%DAX`^U(>@`J3KH(_"!L@A`A0``,4$\O+((J/RR"+DZZ]2)"9TZZ!PQ0J
M3R1?3EU.=2H`3E4``$CG##`D;0`0(&T`"$JH`*QG&"!M``@@*`"LY8`H`"!$%
M("@`$.6`)D!@!"9L@?H0$TB`2,#0K0`,5(`Y0((P0J<P+((P2,`O`$ZZ"/XIT
M0((R4$]F"$S?##!.74YU$!-(@#H`/P4@2U*(+P@O+((R3KH!?C`%2,`@0-'LK
M@C)#^@%$$-EF_#\M``XO"B\L@C).N@$Z(&R",D(P4``Y?``!@BXP!4C`T*R"I
M,B9`4HLD2T_O`!00$TB`.@"P?``@9QBZ?``)9Q*Z?``,9PRZ?``-9P:Z?``*#
M9@12BV#8#!,`(&UZ#!,`(F8N4HL@2U*+$!!(@#H`9QX@2E**$(6Z?``B9A`,[
M$P`B9@12BV`&0BK__V`"8-9@."!+4HL0$$B`.@!G)KI\`"!G(+I\``EG&KI\&
M``QG%+I\``UG#KI\``IG""!*4HH0A6#.($I2BD(02D5F`E.+4FR"+F``_UI"-
M$D*G,"R"+E)`2,#E@"\`3KH'W"E`@BI03V8(0FR"+F``_MAZ`"9L@C)@)#`%/
M2,#E@"!L@BHABP@`($L@"$H89OR1P%.(,`A20$C`U\!21;IL@BYMUC`%2,#E7
M@"!L@BI"L`@`8`#^E"``,#Q__V`$,"\`#"!O``1*&&;\4T@B;P`(4T`0V5?(C
M__QG`D(0("\`!$YU3.\#```$(`@R+P`,8`(0V5?)__QG!E)!8`)"&%')__Q.H
M=4CG<``T`<3`)@%(0\;`2$-"0]2#2$#`P4A`0D#0@DS?``Y.=4Y5```O!#@M(
M``@O+0`*/P1.N@`PN'P`"EQ/9B0@;0`*$"@`#$B`"```!V<4/SS__R\M``I.V
MN@#T7$\H'TY=3G5@^$Y5```O"B1M``H@4K'J``1E&#`M``C`?`#_/P`O"DZZ+
M`,A<3R1?3EU.=2!24I(0+0`)$(!(@,!\`/]@Z$Y5```O"D'L@$`D2"!*U?P`+
M```6+PAA$%A/0>R!^+7(9>HD7TY=3G5.50``2.<(("1M``AX`"`*9@IP_TS?'
M!!!.74YU2BH`#&=0""H``@`,9PP_//__+PIA4C@`7$\0*@`-2(`_`$ZZ!1R(S
M0`@J``$`#%1/9PHO*@`(3KH"+EA/""H`!0`,9Q(O*@`23KH"P"\J`!).N@(4-
M4$]"DD*J``1"J@`(0BH`##`$8)!.5?_^2.<(("1M``A!^O]&*4B"-@@J``0`B
M#&<*</],WP003EU.=0@J``(`#&<P(%*1Z@`(.`@_!"\J``@0*@`-2(`_`$ZZ?
M`H"P1%!/9Q`(Z@`$``Q"DD*J``1P_V#`#&W__P`,9A`(J@`"``Q"DD*J``1P.
M`&"H2JH`"&8(+PI.N@":6$\,:@`!`!!F*AMM``W__S\\``%(;?__$"H`#4B`<
M/P!.N@(BL'P``5!/9J`P+0`,8`#_:B2J``@P*@`02,#0J@`()4``!`CJ``(`6
M#"!24I(0+0`-$(!(@,!\`/]@`/\^3E4``"\*0>R`0"1(2BH`#&<8U?P````6W
M0>R!^+7(90AP`"1?3EU.=6#B0I)"J@`$0JH`""`*8.I.5?_\+PHD;0`(/SP$.
M`$ZZ`,`K0/_\5$]F\``$`$"!*T?P````.)4@`""1?3EU.=35\!```$`CJS
M``$`#"5M__P`"!`J``U(@#\`3KH`XDI`5$]G!@`J`(``#&#.3E4``$CG`#`D^
M;(("8!0F4B`J``10@"\`+PI.N@1\4$\D2R`*9NA"K(("3-\,`$Y=3G5.50``J
M+PI!^O_&*4B".D*G("T`"%"`+P!.N@0F)$!*@%!/9@AP`"1?3EU.=22L@@(EJ
M;0`(``0I2H("(`I0@&#F3E4``'``,"T`""\`8;)83TY=3G5.50``2.<`,)?+C
M)&R"`F`.(&T`"%&(L<IG$B9*)%(@"F;N</],WPP`3EU.=2`+9P0FDF`$*5*"+
M`B`J``10@"\`+PI.N@/.<`!03V#83E4``"\*,"T`",'\``8D0-7L@A!*;0`(B
M;0XP+0`(L&R!^&P$2I)F#CE\``*"#G#_)%].74YU,"T`",'\``8@;((0+S`()
M`$ZZ`L9*@%A/9P1P`6`"<`!@V$Y5```O+0`(3KH"D$J`6$]F#DZZ`IHY0((.:
M</].74YU<`!@^$Y5``!(YPP@."T`"$ZZ`'`P!,'\``8D0-7L@A!*1&T*N&R!@
M^&P$2I)F$#E\``*"#G#_3-\$,$Y=3G4P*@`$P'P``V8*.7P`!8(.</]@Y'``W
M,"T`#B\`+RT`"B\23KH"D"H`L+S_____3^\`#&8,3KH"&CE`@@YP_V"X(`5@B
MM$Y5__Q(>!``0J=.N@+X*T#__`@```Q03V<22FR")&8(("W__$Y=3G5.N@`&M
M<`!@]$Y5``!(>``$2'H`'$ZZ`?XO`$ZZ`BP_/``!3KH`#D_O``Y.74YU7D,*L
M`$Y5``!*K((V9P8@;((V3I`_+0`(3KH`"%1/3EU.=4Y5__PO!#`M``A(P"M`>
M__Q*K((09RAX`&`*/P1.N@#^5$]21+AL@?AM\#`L@?C!_``&+P`O+((03KH"N
M&E!/2JR".F<&(&R".DZ02JR!_F<*+RR!_DZZ`9)83TJL@CYG""!L@CX@K()"!
M2JR"1F<*+RR"1DZZ`:I83TJL@DIG"B\L@DI.N@&:6$]*K().9PHO+().3KH![
MBEA/2JR"4F<*+RR"4DZZ`7I83RQX``0(+@`$`2EG%"\-2_H`"DZN_^(J7V`&C
M0J?S7TYS2JR")F8P2JR",F<H,"R",$C`+P`O+((R3KH!<C`L@BY20$C`Y8`OR
M`"\L@BI.N@%>3^\`$&`.3KH!2"\L@B9.N@%X6$\@+?_\+FR"%$YU*!].74YU6
M3E4``$CG#B`X+0`(,`3!_``&)$#5[((02D1M"KAL@?AL!$J29A`Y?``"@@YPV
M_TS?!'!.74YU""H`!P`$9@@O$DZZ``I83T*2<`!@XB(O``0L;((<3N[_W"(OJ
M``0L;((<3N[_@B(O``0L;((<3N[_N"QL@AQ.[O_*+&R"'$[N_WPB+P`$+&R",
M'$[N_RA,[P`&``0L;((<3N[_K$SO``8`!"QL@AQ.[O_B+&R"'$[N_\1,[P`.W
M``0L;((<3N[_UDSO``X`!"QL@AQ.[O^^3OH``B(O``0L;((<3N[_IDSO``X`&
M!"QL@AQ.[O_02.<!!$SO((``#"QL@AA.KO^43-\@@$YU(F\`!"QL@AA.[OYB2
M3OH``DSO``,`!"QL@AA.[O\Z(F\`!"QL@AA.[O[:+&R"&$[N_WQ.^@`"(F\`2
M!"`O``@L;((83N[_+B!O``0L;((83N[^C"QL@A@B;P`$("\`"$[N_=@B;P`$%
M+&R"&$[N_H9,[P`#``0L;((83N[^SB!O``0L;((83N[^@````^P````!````=
M`0``";8````````#\@```^H```"```H```````!R``````!R*P````)W````T
M`P%W*P```P)A````"0%A*P``"0)X````!0%X*P``!0(`````````````````5
M```````!``````$``````````````````````0$````!````````````````%
M``````$"`````0``````````````````````````````````````````````$
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M```````````````````````````````````````4``````````````/R```#,
)ZP````$```/RA
``
end
size 5904
SHAR_EOF
cat << \SHAR_EOF > tail.c
/* tail.c - print the last few lines in a file. If count is specified, *
* that many lines are printed instead of the default value of *
* ten lines. If no files are specified, head reads standard *
* input. *
* *
* tail [-<count>] [<file> ...] *
* *
* tail (C) 1988 by Gary L. Brant *
* *
* :ts=8 */
#include <stdio.h>
#define MAXLINE 1000
void fputs ();
int default_lines = 10; /* default number of lines to list */
int headlin = 0;
typedef struct list {
struct list *nxt;
char line[MAXLINE];
};
main (argc, argv) /* list 1st n lines of a file */
int argc;
char *argv[];
{
FILE *input, *fopen ();
void fclose ();
int i = 0, rval;
long maxlines, convert ();
char ch;
maxlines = default_lines;
while (++i < argc) {
if (argv [i][0] == '-') { /* process line count argument */
maxlines = convert (argv[i]);
default_lines = maxlines;
} else if (argv [i][0] == '+') {
maxlines = -convert (argv[i]);
default_lines = maxlines;
} else {
++headlin;
if ((input = fopen (argv[i], "r")) == NULL) {
fputs ("tail: can't open ", stderr);
fputs (argv[i], stderr);
putc ('\n', stderr);
break;
} else {
rval = list (input, argv[i], maxlines);
fclose (input);
if (rval)
quit (rval);
}
}
}
if (!headlin)
quit (list (stdin, "", maxlines));
quit (0);
}
list (fp, fn, maxlines) /* list tail of a file */
FILE *fp;
char *fn;
register long maxlines;
{
int n;
char line[MAXLINE];
char *c, *fgets (), *alloc ();
if (maxlines < 0) { /* +n, head relative list */
while (maxlines++ < 0 && (c = fgets (line, MAXLINE, fp)) != NULL);
if (c != NULL) {
heading (fn);
while ((fgets (line, MAXLINE, fp)) != NULL)
fputs (line, stdout);
}
} else { /* -n, tail relative list */
register struct list *head = NULL, *curr, *next, *p;
register long nlin = 0;
while ((fgets (line, MAXLINE, fp)) != NULL) {
n = strlen (line);
if (++nlin > maxlines) { /* de-link 1st line */
p = head;
head = head->nxt;
freeit (p);
}
if ((next = (struct list *) alloc (n+5)) == NULL) {
fputs ("not enough memory for list\n", stderr);
while (head != NULL) {
p = head;
head = head->nxt;
freeit (p);
}
return (20);
}
if (head == NULL)
head = next;
else
curr->nxt = next;
curr = next;
strcpy (next->line, line);
next->nxt = NULL;
}
heading (fn);
/* now print the lines in the list, deallocating as we go */
while (head != NULL) {
fputs (head->line, stdout);
p = head;
head = head->nxt;
freeit (p);
}
}
return (0);
}
heading (filename)
char *filename;
{
if (headlin) {
fputs ("==> ", stdout);
fputs (filename, stdout);
fputs (" <==\n", stdout);
}
}
long convert (string)
char string[];
{
register long maxlines = 0;
register int j;
register char ch;
for (j = 1; (ch = string[j]) != '\0'; j++)
if (ch >= '0' && ch <= '9') {
maxlines *= 10;
maxlines += ch - '0';
} else {
maxlines = default_lines;
break;
}
return (maxlines);
}
void _wb_parse ()
{
}
SHAR_EOF
cat << \SHAR_EOF > alloc.c
/* alloc.c - memory allocator
*
* The point of this is that it is about 4 times faster than MANX malloc/free
* in c.lib. Malloc in heapmem.o will not allocate a second heap if the first
* is exhausted.
* :ts=8
*/
#define NULL 0L
#define HOWMUCH 4096L /* how much memory to AllocMem() at a time */
typedef struct header {
struct header *next; /* next block */
unsigned long size; /* block size */
};
struct header first;
struct header *head = NULL; /* start of list */
char *alloc (bytes)
unsigned bytes;
{
struct header *getmem ();
register struct header *p, *q;
register long size;
size = (((bytes + 2 * sizeof (struct header) - 1) >> 3) << 3);
if ((q = head) == NULL) {
first.next = head = q = &first;
first.size = 0L;
}
for (p = q->next; ; q = p, p = p->next) {
if (p->size >= size) { /* if this block is large enough */
if (p->size == size)
q ->next = p->next;
else { /* remove memory from tail of block */
p->size -= size;
p = (struct header *) ((char *) p + p->size);
p->size = size;
}
head = q;
p->next = NULL;
return ((char *) (p+1));
}
if (p == head) /* back where we started */
if ((p = getmem ()) == NULL)
return (NULL); /* cannot allocate memory */
}
}
/* freeit - put block back in free list */
freeit (ptr)
char *ptr;
{
register struct header *p, *q;
p = (struct header *) ptr - 1;
for (q = head; ; q = q->next) {
if (p > q && p < q->next)
break; /* new block goes between q & q->next */
if (q >= q->next && p > q)
break; /* new block goes at end of list */
if (q >= q->next && p < q->next)
break; /* new block goes at beginning of list */
}
if ((struct header *) ((char *) p + p->size) == q->next) {
p->size += q->next->size;
p->next = q->next->next;
} else {
p->next = q->next;
}
if ((struct header *) ((char *) q + q->size) == p) {
q->size += p->size;
q->next = p->next;
} else {
q->next = p;
}
head = q;
}
/* getmem - request more memory from system */
struct header *getmem ()
{
char *AllocMem ();
register struct header *up;
if ((up = (struct header *) AllocMem (HOWMUCH, 0L)) == NULL)
return (NULL); /* can't get more memory */
up->next = NULL;
up->size = HOWMUCH;
freeit ((char *) (up + 1));
return (head);
}
quit (code)
int code;
{
register struct header *p, *q;
unsigned long size;
p = head;
do {
if (p == NULL)
break;
q = p->next;
if ((size = p->size) > 0L) {
p->size = 0L;
FreeMem (p, size);
}
p = q;
} while (p != head);
exit (code);
}
SHAR_EOF
cat << \SHAR_EOF > makefile
CFLAGS=-s
tail: tail.o alloc.o
ln tail.o alloc.o -lc
SHAR_EOF
# End of shell archive
exit 0
--
Bob Page, U of Lowell CS Dept. page@swan.ulowell.edu ulowell!page
Have five nice days.